home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 142 / Gekkan Dennou Club - 2000.3 Vol. 142 (Japan).7z / Gekkan Dennou Club - 2000.3 Vol. 142 (Japan) (Track 1).bin / tools / s44play / s44p101s.lzh / cdda.s < prev    next >
Text File  |  1999-12-19  |  8KB  |  384 lines

  1.     .include    global.mac
  2.     .include    preconv.mac
  3.  
  4. ;----------------------------------------------------------------
  5. ;CDDA(Compact Disc Digital Audio)
  6.  
  7. ;----------------------------------------------------------------
  8. ;CDDAをオープンする
  9. ;<current_param_ptr.l:パラメータバッファのアドレス
  10. ;>next_param_ptr.l:次のパラメータバッファのアドレス
  11. ;>d0.l:負数=エラー,0=データなし正常終了,その他=データあり
  12. ;>n-flag:mi=エラー
  13. ;>z-flag:eq=データなし正常終了
  14.     .text
  15.     .align    4,$2048
  16. open_cdda::
  17.     movem.l    d1-d3/d7/a0,-(sp)
  18.  
  19.     bsr    init_scsiid
  20.     bmi    99f
  21.     bsr    init_cdrom
  22.     bmi    99f
  23.  
  24.     move.w    #SS16L,data_format    ;データのフォーマット
  25.     move.l    #44100,data_frequency    ;データのサンプリング周波数
  26.  
  27.     movea.l    current_param_ptr,a2
  28.     move.l    (pb_trktop,a2),d2    ;開始トラック番号
  29.     cmp.l    cdda_mintrk,d2
  30.     bgt    @f
  31.     move.l    cdda_mintrk,d2
  32.     move.l    d2,(pb_trktop,a2)
  33. @@:
  34.  
  35.     move.l    (pb_trkbtm,a2),d3    ;終了トラック番号
  36.     cmp.l    cdda_maxtrk,d3
  37.     blt    @f
  38.     move.l    cdda_maxtrk,d3
  39.     move.l    d3,(pb_trkbtm,a2)
  40. @@:
  41.  
  42.     cmp.l    d2,d3
  43.     blt    80f            ;n1>n2
  44.     beq    1f
  45.     addq.l    #1,(pb_trktop,a2)
  46.     move.l    a2,next_param_ptr
  47.     bra    2f
  48. 1:    lea.l    (pb_size,a2),a0
  49.     move.l    a0,next_param_ptr
  50. 2:
  51.  
  52.     cmp.l    cdda_mintrk,d2
  53.     blo    81f
  54.     cmp.l    cdda_maxtrk,d3
  55.     bhi    81f
  56.  
  57. 1:    move.l    d2,d0
  58.     bsr    cdda_getfrm
  59.     bmi    82f
  60.     tst.b    d1
  61.     beq    2f
  62.     tst.b    silent_flag
  63.     bne    @f
  64.     lea.l    (m_open_skip_1,pc),a0
  65.     bsr    eprint
  66.     move.l    d2,d0
  67.     bsr    utos_eprint
  68.     lea.l    (m_open_skip_2,pc),a0
  69.     bsr    eprintcrlf
  70. @@:
  71.     addq.b    #1,d2
  72.     cmp.b    d2,d3
  73.     bhs    1b
  74. ;データトラックで終わり
  75.     tst.b    (pb_done,a2)
  76.     beq    90f
  77.     sf.b    (pb_done,a2)
  78.     bra    98f            ;正常終了
  79.  
  80. 2:    move.l    d0,cdda_stafrm        ;演奏開始フレーム番号
  81.     move.l    d0,cdda_curfrm        ;現在のフレーム番号
  82.  
  83.     cmp.b    d2,d3
  84.     beq    1f            ;今回のトラックで終わり
  85.     move.b    d2,d3
  86.     move.l    d2,d0
  87.     addq.b    #1,d0            ;次のトラックも再生する
  88.     move.l    d0,(pb_trktop,a2)
  89.     movea.l    a2,a0
  90.     bra    2f
  91. 1:    sf.b    (pb_done,a2)
  92.     lea.l    (pb_size,a2),a0
  93. 2:    move.l    a0,next_param_ptr
  94.  
  95. ;<d2.l:開始トラック
  96. ;<d3.l:終了トラック
  97. ;現在d2=d3のみだが,これ以降はd2<d3でも動作する
  98.  
  99.     move.l    cdda_maxfrm,d0        ;最後のトラックまでのときは最後のフレームまで
  100.     cmp.l    cdda_maxtrk,d3
  101.     beq    2f
  102.     move.l    d3,d0
  103.     addq.b    #1,d0            ;終了トラックの次のトラック
  104.     bsr    cdda_getfrm
  105.     bmi    82f
  106. 2:    move.l    d0,cdda_endfrm        ;演奏終了フレーム番号
  107.  
  108.     tst.b    silent_flag
  109.     bne    1f
  110.     lea.l    (m_open_cdda_track1,pc),a0
  111.     bsr    eprint
  112.     move.l    d2,d0
  113.     bsr    utos_eprint
  114.   .if 0
  115.     cmp.l    d2,d3
  116.     beq    @f
  117.     lea.l    (m_open_cdda_track2,pc),a0
  118.     bsr    eprint
  119.     move.l    d3,d0
  120.     bsr    utos_eprint
  121. @@:
  122.   .endif
  123. 1:
  124.  
  125.     tst.b    silent_flag
  126.     bne    1f
  127.     lea.l    (-256,sp),sp
  128.     movea.l    sp,a0
  129.     move.b    #' ',(a0)+
  130.     move.l    d2,d0
  131.     bsr    get_track_name
  132.     beq    @f
  133.     movea.l    sp,a0
  134.     bsr    eprint
  135. @@:    lea.l    (256,sp),sp
  136. 1:
  137.  
  138.     tst.b    silent_flag
  139.     bne    1f
  140.     lea.l    (m_open_cdda_track3,pc),a0
  141.     tst.b    conv_flag
  142.     beq    @f
  143.     lea.l    (m_open_cdda_track4,pc),a0
  144. @@:    bsr    eprintcrlf
  145. 1:
  146.  
  147.     moveq.l    #1,d0            ;データあり
  148.     bra    99f
  149.  
  150. 98:    moveq.l    #0,d0            ;データなし正常終了
  151. 99:    movem.l    (sp)+,d1-d3/d7/a0
  152.     rts
  153.  
  154. 80:    move.w    #EXIT_ILLEGAL_TRACK,exit_code
  155.     lea.l    (m_illegal_track,pc),a0
  156.     bra    89f
  157. 81:    move.w    #EXIT_OUTSIDE_TRACK,exit_code
  158.     lea.l    (m_outside_track,pc),a0
  159.     bra    89f
  160. 82:    move.w    #EXIT_TRACK_INF_ERROR,exit_code
  161.     lea.l    (m_cdda_open_error,pc),a0
  162. 89:    bsr    eaprintcrlf
  163. 90:    moveq.l    #-1,d0
  164.     bra    99b
  165.  
  166. m_open_cdda_track1:    .dc.b    'トラック ',0
  167.   .if 0
  168. m_open_cdda_track2:    .dc.b    '~',0
  169.   .endif
  170. m_open_cdda_track3:    .dc.b    ' を再生します',0
  171. m_open_cdda_track4:    .dc.b    ' を変換します',0
  172. m_open_skip_1:        .dc.b    'トラック ',0
  173. m_open_skip_2:        .dc.b    ' はデータトラックです',0
  174. m_illegal_track:    .dc.b    'トラック番号の指定が異常です',0
  175. m_outside_track:    .dc.b    'トラック番号が範囲外です',0
  176. m_cdda_open_error:    .dc.b    '指定されたトラックの情報の取得に失敗しました',0
  177.     .even
  178.  
  179.     .bss
  180.     .align    4
  181. cdda_stafrm:    .ds.l    1    ;演奏開始フレーム番号
  182. cdda_endfrm:    .ds.l    1    ;演奏終了フレーム番号
  183. cdda_curfrm:    .ds.l    1    ;現在のフレーム番号
  184.  
  185. ;----------------------------------------------------------------
  186. ;トラック番号から開始フレーム番号を得る
  187. ;<d0.b:トラック番号
  188. ;>d0.l:開始フレーム番号(0~)
  189. ;>d1.b:0=音声トラック,4=データトラック,-1=エラー
  190. ;>z-flag:mi=エラー
  191.     .text
  192.     .align    4,$2048
  193. cdda_getfrm:
  194.     bsr    cdda_gettim
  195.     bmi    @f
  196.     bsr    msf2frm
  197.     tst.l    d0
  198. @@:    rts
  199.  
  200. ;----------------------------------------------------------------
  201. ;トラック番号から開始フレーム番号(MSF形式)を得る
  202. ;<d0.b:トラック番号
  203. ;>d0.l:開始位置(mm:ss:ff,2秒~),-1=エラー
  204. ;>d1.b:0=音声トラック,4=データトラック
  205. ;>z-flag:mi=エラー
  206.     .text
  207.     .align    4,$2048
  208. cdda_gettim:
  209.     lea.l    (-256,sp),sp
  210.     move.b    d0,cmd_readtoc+6
  211.  
  212.     move.l    sp,-(sp)
  213.     pea.l    12.w
  214.     pea.l    cmd_readtoc
  215.     pea.l    10.w
  216.     bsr    scsicmd
  217.     lea.l    (16,sp),sp
  218.     bmi    80f
  219.  
  220.     moveq.l    #$04,d1
  221.     and.b    (5,sp),d1
  222.     move.l    (8,sp),d0
  223.     and.l    #$00FFFFFF,d0
  224.  
  225. 99:    lea.l    (256,sp),sp
  226.     rts
  227.  
  228. 80:    bsr    print_scsicmd_error
  229.     moveq.l    #-1,d0
  230.     bra    99b
  231.  
  232. ;----------------------------------------------------------------
  233. ;CDDAから読み込む
  234. ;<a0.l:出力バッファの先頭
  235. ;<a1.l:入力バッファの先頭
  236. ;>d0.l:データのサイズ,-1=エラー
  237.     .text
  238.     .align    4,$2048
  239. read_cdda::
  240.     movem.l    d1-d7/a0-a6,-(sp)
  241.     move.l    a0,d7            ;バッファのアドレス
  242.     movea.l    a1,a6            ;開始アドレス
  243.     movea.l    a1,a2            ;開始アドレス
  244.  
  245.   .if TEST_68000=0
  246.     IS68000    d0
  247.     bne    @f
  248.   .endif
  249.     addq.l    #1,a2            ;68000でlittle-endian
  250. @@:
  251.  
  252.     movea.l    cdda_curfrm,a4        ;開始フレーム番号
  253.  
  254.     movea.l    cdda_endfrm,a5
  255.     suba.l    a4,a5            ;転送フレーム数
  256.     move.l    a5,d0
  257.     beq    99f            ;0なら終了
  258.     move.l    buffrm,d5        ;バッファのフレーム数
  259.     move.b    read_shift_count,d1
  260.     lsr.l    d1,d5
  261.     cmp.l    d5,a5
  262.     bls    @f
  263.     move.l    d5,a5
  264. @@:
  265.  
  266. 10:    move.l    stpfrm,d5        ;今回の転送フレーム数
  267.     cmp.l    a5,d5
  268.     bls    @f
  269.     move.l    a5,d5
  270. @@:
  271.  
  272.     move.w    d5,d3
  273.     mulu.w    #BUFFRM_UNIT,d3        ;今回の転送バイト数
  274.                     ;buffrmは65535までなのでmulu.wで十分
  275.  
  276.     move.l    a4,d0            ;開始フレーム番号
  277.     move.l    d5,d1            ;転送フレーム数
  278.     movea.l    a2,a0            ;バッファ
  279.     bsr    read_cdrom_audio_2352
  280.     bpl    1f
  281.  
  282.     tst.b    force_flag
  283.     beq    80f
  284.     cmpi.b    #-1,scsicmd_error_call
  285.     bne    80f
  286.     cmpi.b    #$02,scsicmd_error_sts
  287.     bne    80f
  288.     cmpi.b    #$3,scsicmd_error_sns
  289.     bne    80f
  290.  
  291.     moveq.l    #'!',d0            ;Medium Errorのとき
  292.     bsr    silent_eputchar
  293.  
  294.     addq.l    #1,a4            ;1フレームだけ進む
  295.     subq.l    #1,a5
  296.     bra    11f
  297. 1:
  298.  
  299.     adda.l    d5,a4            ;次回のフレーム番号
  300.     suba.l    d5,a5            ;残りフレーム数
  301.  
  302.     adda.l    d3,a2            ;次回のアドレス
  303.  
  304.   .if CURRENT_TIME=0
  305.     moveq.l    #'.',d0
  306.     bsr    silent_eputchar
  307.   .endif
  308. 11:
  309.     tst.b    esc_aborted
  310.     bne    90f
  311.  
  312.     move.l    a5,d0            ;残りフレーム数
  313.     bne    10b
  314.  
  315.     move.l    a4,cdda_curfrm        ;次回の開始フレーム番号
  316.  
  317. ;68000のとき必要ならばmovepを使ったエンディアン変換を行う
  318.   .if TEST_68000=0
  319.     IS68000    d0
  320.     bne    @f
  321.   .endif
  322.     subq.l    #1,a2            ;68000でlittle-endian
  323.     move.l    a2,d0
  324.     sub.l    a6,d0
  325.     movea.l    a6,a0
  326.     bsr    convert_endian_68000
  327. @@:
  328.  
  329.     movea.l    d7,a0            ;出力バッファの先頭
  330.     movea.l    a6,a1            ;入力データの先頭
  331. *    movea.l    a2,a2            ;入力データの末尾+1
  332.     move.l    a0,-(sp)
  333.     movea.l    preconv_routine,a6    ;PCMデータをOPMのTLの並びに変換する
  334.     jsr    (a6)
  335.     movea.l    (sp)+,a1        ;出力データの先頭
  336.  
  337.     move.l    a0,d0            ;出力データの末尾
  338.     sub.l    a1,d0            ;出力データの長さ
  339.     beq    99f
  340.  
  341.     tas.b    (-1,a0)            ;エンドコードを付加する
  342.     smi.b    d1
  343.     neg.b    d1
  344.     sf.b    (a0)
  345.     move.b    d1,(1,a0)        ;0,1(末尾のデータのbit7の値)
  346.  
  347.     move.l    a1,nxttop
  348.  
  349.     tst.l    d0
  350. 99:    movem.l    (sp)+,d1-d7/a0-a6
  351.     rts
  352.  
  353. 80:    bsr    ecrlf
  354.     bsr    print_scsicmd_error
  355.     move.w    #EXIT_READ_CDDA_ERROR,exit_code
  356.     lea.l    (m_read_cdda_error,pc),a0
  357.     bsr    eprintcrlf
  358. 90:    moveq.l    #-1,d0
  359.     bra    99b
  360.  
  361. m_read_cdda_error:    .dc.b    13,10
  362.             .dc.b    '読み込みエラー',0
  363.  
  364. ;----------------------------------------------------------------
  365. ;CDDAをクローズする
  366.     .text
  367.     .align    4,$2048
  368. close_cdda::
  369.     bsr    tini_cdrom
  370.     moveq.l    #0,d0
  371.     rts
  372.  
  373. ;----------------------------------------------------------------
  374. ;入力データの残りバイト数を得る
  375. ;>d0.l:データの残りバイト数
  376.     .text
  377.     .align    4,$2048
  378. get_restsize_cdda::
  379.     move.l    cdda_endfrm,d0
  380.     sub.l    cdda_curfrm,d0
  381.     mulu.w    #BUFFRM_UNIT,d0
  382.     rts
  383.  
  384.